package algo_annotations.data.annotations;

import commons.drawing.SegmentDrawable;

public class LienAnnoSite extends SegmentDrawable {

	// compris entre -Pi et +Pi
	public double angle;
	public Anno anno;

	public LienAnnoSite(Anno anno) {
		super(anno.getColor().darker(), 1f);
		this.angle=0;
		this.anno = anno;
	}

	public LienAnnoSite getCopy() {
		LienAnnoSite copy = new LienAnnoSite(anno);
		copy.setCoord(this.pt1.x, this.pt1.y, this.pt2.x, this.pt2.y);
		copy.color = this.color;
		copy.width_reel_m = this.width_reel_m;
		copy.width_topo_px = this.width_topo_px;
		copy.angle = this.angle;
		return copy;
	}

	// Appelée par l'anno à chaque fois que sa position a changé
	public void updateCoordLien(Anno anno) {
		if (!anno.site.hasAnno()) return; // site sans anno
		pt1 = anno.site;

		// TROP GOURMAND EN GC
		//pt2 = anno.getCenter();

		pt2.x = (anno.xMax+anno.xMin) / 2;
		pt2.y = (anno.yMax+anno.yMin) / 2;

		if (anno.xMin > anno.site.x)
			// anno a droite de son site
			pt2.x = anno.xMin;
		else if (anno.xMax < anno.site.x)
			// anno a gauche de son site
			pt2.x = anno.xMax;
		else
			pt2.x = anno.site.x;

		if (anno.yMin > anno.site.y)
			// anno en haut de son site
			pt2.y = anno.yMin;
		else if (anno.yMax < anno.site.y)
			// anno en dessous de son site
			pt2.y = anno.yMax;
		else
			pt2.y = anno.site.y;

		// Calcul de l'angle
		double lg = getLength();
		if (lg==0) {
			angle = 0;
		} else {
			double cosAngle = (pt2.x-pt1.x) / lg;
			if (cosAngle>1) cosAngle = 1; // cas d'erreurs d'arrondi
			if (cosAngle<-1) cosAngle = -1; // cas d'erreurs d'arrondi

			// ici, angle va etre compris entre 0 et Pi
			angle = Math.acos((pt2.x-pt1.x) / lg);
			if (pt2.y<pt1.y)
				//le segment descend
				angle = -angle;
			// angle est compris entre -Pi et Pi
			
			assert (angle>=-Math.PI && angle<=Math.PI) : angle;
		}

	}

}
